package com.mh.common;




import com.mh.dto.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.dao.RecoverableDataAccessException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.time.LocalDateTime;

/**
 * Date:2025/2/10
 * author:zmh
 * description: 全局异常处理器
 **/

@RestControllerAdvice
@Slf4j
public class GlobalExceptionAdvice {

    /**
     * 通用异常返回
     * @param e ·
     * @return ·
     */
    @ExceptionHandler(Exception.class)
    public R<String> handleException(Exception e) {
		log.error("{},出现异常", LocalDateTime.now(), e);
        return R.error("系统未知异常（500），请稍后重试！");
    }

    /**
     * 请求方法异常
     * @param e ·
     * @return ·
     */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public R<String> requestMethodsException(@NotNull Exception e) {
		log.warn("{},出现【请求方法】异常", LocalDateTime.now(), e);
        return R.error("请求方法与URL地址不匹配!");
    }

    /**
     * 空指针异常
     * @param e ·
     * @return ·
     */
    @ExceptionHandler(NullPointerException.class)
    public R<String> nullPointerException(Exception e) {
		log.error("{},出现【空指针】异常", LocalDateTime.now(), e);
        return R.error("系统出错（nullPointer），请联系管理员！");
    }

    /**
     * 数据源访问异常
     * @param e  ·
     * @return ·
     */
    @ExceptionHandler(RecoverableDataAccessException.class)
    public R<String> dataAccessException(Exception e) {
		log.warn("{},出现【数据源连接超时异常】异常", LocalDateTime.now(), e);
        return R.error("连接超时，请稍后重试！");
    }

    @ExceptionHandler(MyTokenException.class)
    public R<String> tokenException(Exception e) {
		log.warn("{},出现【权限异常token】异常: {}", LocalDateTime.now(), e.getMessage());
        return R.errorToken(e.getMessage());
    }
}
